package com.zhaoxinms.office.merge;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import com.zhaoxinms.office.merge.mergeImpl.BookmarkMerge;
import com.zhaoxinms.office.merge.mergeImpl.ContentControlMerge;
import com.zhaoxinms.office.merge.mergeImpl.PlaceholderMerge;
import com.zhaoxinms.office.merge.model.DocContent;

/**
 * ContentControl合并测试类
 * 包含HTML格式功能演示
 */
public class Test {
	
	public void TestUsePlaceholderMerge() {
		String inputFileName = "file1.docx";
		String outputFileName = "file1-result.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        List<DocContent> docContents = new ArrayList<DocContent>();
        
        DocContent doc = new DocContent();
        doc.setContent("山西肇新科技有限公司");
        doc.setKey("{{jiafang}}");
        docContents.add(doc);
        
        DocContent doc1 = new DocContent();
        doc1.setContent("北京某某科技有限公司");
        doc1.setKey("{{yifang}}");
        docContents.add(doc1);
        
        PlaceholderMerge merge = new PlaceholderMerge();
        merge.doMerge(basePath + File.separator +inputFileName,basePath + File.separator + outputFileName, docContents);
        System.out.println("占位符合成的文件地址：" + basePath + File.separator + outputFileName);
	}
	
	public void TestBookmarkMerge() {
		String inputFileName = "file2.docx";
		String outputFileName = "file2-result.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        List<DocContent> docContents = new ArrayList<DocContent>();
        
        DocContent doc = new DocContent();
        doc.setContent("山西肇新科技有限公司");
        doc.setKey("jiafang");
        docContents.add(doc);
        
        DocContent doc1 = new DocContent();
        doc1.setContent("北京某某科技有限公司");
        doc1.setKey("yifang");
        docContents.add(doc1);
        
        BookmarkMerge merge = new BookmarkMerge();
        merge.doMerge(basePath + File.separator +inputFileName,basePath + File.separator + outputFileName, docContents);
        System.out.println("书签合成的文件地址：" + basePath + File.separator + outputFileName);
	}
	
	public void TestContentControlMerge() {
		String inputFileName = "file3.docx";
		String outputFileName = "file3-result.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        List<DocContent> docContents = new ArrayList<DocContent>();
        
        DocContent doc = new DocContent();
        doc.setContent("山西肇新科技有限公司");
        doc.setKey("templateElement659406749519941");
        docContents.add(doc);
        
        DocContent doc1 = new DocContent();
        doc1.setContent("北京某某科技有限公司");
        doc1.setKey("templateElement659406838063173");
        docContents.add(doc1);
        
        ContentControlMerge merge = new ContentControlMerge();
        merge.doMerge(basePath + File.separator +inputFileName,basePath + File.separator + outputFileName, docContents);
        System.out.println("书签合成的文件地址：" + basePath + File.separator + outputFileName);
	}
	
	/**
	 * 测试基本的ContentControl合并功能
	 */
	public static void testContentControlMerge() {
		System.out.println("=== 测试基本ContentControl合并功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_basic.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		
		List<DocContent> contents = new ArrayList<>();
		contents.add(new DocContent("name", "张三"));
		contents.add(new DocContent("company", "ABC科技有限公司"));
		contents.add(new DocContent("position", "软件工程师"));
		contents.add(new DocContent("date", "2024年12月28日"));
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, contents);
			System.out.println("基本合并完成！输出文件: " + basePath + File.separator + outputFileName);
		} catch (Exception e) {
			System.err.println("基本合并失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试HTML格式功能
	 */
	public static void testHtmlFormatMerge() {
		System.out.println("\n=== 测试HTML格式合并功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_html.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		
		List<DocContent> contents = new ArrayList<>();
		
		// 基本HTML标签示例
		contents.add(new DocContent("name", "<b>李四</b>")); // 粗体
		contents.add(new DocContent("company", "<i>XYZ技术公司</i>")); // 斜体
		contents.add(new DocContent("position", "<u>高级开发工程师</u>")); // 下划线
		
		// 混合格式示例
		contents.add(new DocContent("description", 
			"<b>重要通知：</b><br/>" +
			"根据公司规定，<i>所有员工</i>必须遵守以下要求：<br/>" +
			"1. <u>按时上班</u><br/>" +
			"2. <b><i>保持工作环境整洁</i></b><br/>" +
			"3. <span style=\"font-weight: bold; text-decoration: underline;\">遵守保密协议</span>"
		));
		
		// 使用span标签的CSS样式示例
		contents.add(new DocContent("highlight", 
			"<span style=\"font-weight: bold;\">粗体文本</span> 和 " +
			"<span style=\"font-style: italic;\">斜体文本</span> 以及 " +
			"<span style=\"text-decoration: underline;\">下划线文本</span>"
		));
		
		// 段落和换行示例
		contents.add(new DocContent("contract_terms", 
			"<p><b>合同条款：</b></p>" +
			"<p>1. 本合同自签署之日起生效</p>" +
			"<p>2. <i>甲乙双方</i>应严格遵守合同条款</p>" +
			"<p>3. 如有争议，应<u>友好协商</u>解决</p>"
		));
		
		// 日期信息（纯文本，不包含HTML）
		contents.add(new DocContent("date", "2024年12月28日"));
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, contents);
			System.out.println("HTML格式合并完成！输出文件: " + basePath + File.separator + outputFileName);
			
			// 打印示例内容
			System.out.println("\n支持的HTML格式示例：");
			System.out.println("1. 粗体: <b>文本</b> 或 <strong>文本</strong>");
			System.out.println("2. 斜体: <i>文本</i> 或 <em>文本</em>");
			System.out.println("3. 下划线: <u>文本</u>");
			System.out.println("4. 换行: <br/> 或 <br>");
			System.out.println("5. 段落: <p>段落内容</p>");
			System.out.println("6. 内联样式: <span style=\"font-weight: bold;\">文本</span>");
			System.out.println("7. 混合格式: <b><i>粗体斜体</i></b>");
			
		} catch (Exception e) {
			System.err.println("HTML格式合并失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 使用实际模板标识符测试HTML格式功能
	 */
	public static void testRealTemplateWithHtmlFormat() {
		System.out.println("\n=== 使用实际模板标识符测试HTML格式功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_real_template.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		List<DocContent> docContents = new ArrayList<>();
		
		// 使用您提供的实际tag - 基本格式示例
		DocContent doc = new DocContent();
		doc.setContent("<b>山西肇新科技有限公司</b>");  // 粗体格式
		doc.setKey("templateElement659406749519941");
		docContents.add(doc);
		
		// 第二个tag - 混合HTML格式
		DocContent doc1 = new DocContent();
		doc1.setContent("<i>北京某某科技有限公司</i><br/><u>技术服务商</u>");  // 斜体 + 换行 + 下划线
		doc1.setKey("templateElement659406838063173");
		docContents.add(doc1);
		
		// 第三个tag - 复杂HTML格式
		DocContent doc2 = new DocContent();
		doc2.setContent(
			"<p><b>合作协议详情：</b></p>" +
			"<p>1. 合作期限：<u>2024年1月1日至2024年12月31日</u></p>" +
			"<p>2. 合作内容：<i>软件开发与技术咨询服务</i></p>" +
			"<p>3. <span style=\"font-weight: bold; text-decoration: underline;\">重要条款</span>：双方应严格遵守保密协议</p>"
		);
		doc2.setKey("templateElement659406838063174");
		docContents.add(doc2);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("实际模板HTML格式合并完成！输出文件: " + basePath + File.separator + outputFileName);
			
			// 显示使用的内容
			System.out.println("\n使用的HTML格式内容：");
			System.out.println("Tag: templateElement659406749519941");
			System.out.println("内容: " + doc.getContent());
			
			System.out.println("\nTag: templateElement659406838063173");
			System.out.println("内容: " + doc1.getContent());
			
			System.out.println("\nTag: templateElement659406838063174");
			System.out.println("内容: " + doc2.getContent());
			
		} catch (Exception e) {
			System.err.println("实际模板合并失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试纯文本与HTML格式的对比
	 */
	public static void testPlainTextVsHtmlFormat() {
		System.out.println("\n=== 纯文本与HTML格式对比测试 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_plain_text.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace(); 
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		List<DocContent> docContents = new ArrayList<>();
		
		// 纯文本版本
		DocContent plainDoc = new DocContent();
		plainDoc.setContent("山西肇新科技有限公司");  // 纯文本
		plainDoc.setKey("templateElement659406749519941");
		docContents.add(plainDoc);
		
		DocContent plainDoc1 = new DocContent();
		plainDoc1.setContent("北京某某科技有限公司\n技术服务商");  // 纯文本带换行
		plainDoc1.setKey("templateElement659406838063173");
		docContents.add(plainDoc1);
		
		DocContent plainDoc2 = new DocContent();
		plainDoc2.setContent("合作协议详情：\n1. 合作期限：2024年1月1日至2024年12月31日\n2. 合作内容：软件开发与技术咨询服务");
		plainDoc2.setKey("templateElement659406838063174");
		docContents.add(plainDoc2);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("纯文本合并完成！输出文件: " + basePath + File.separator + outputFileName);
			System.out.println("您可以对比 output_real_template.docx 和 output_plain_text.docx 来查看HTML格式的效果差异");
			
		} catch (Exception e) {
			System.err.println("纯文本合并失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试块级SDT和输出所有tag功能
	 */
	public static void testBlockSdtAndShowAllTags() {
		System.out.println("\n=== 测试块级SDT和输出所有tag功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_block_sdt_test.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		List<DocContent> docContents = new ArrayList<>();
		
		// 为已知的tag添加测试数据
		DocContent doc1 = new DocContent();
		doc1.setContent("<b>山西肇新科技有限公司</b> - 行内SDT测试");
		doc1.setKey("templateElement659406749519941");
		docContents.add(doc1);
		
		DocContent doc2 = new DocContent();
		doc2.setContent("<p><i>北京某某科技有限公司</i></p><p><u>技术服务提供商</u></p>");
		doc2.setKey("templateElement659406838063173");
		docContents.add(doc2);
		
		DocContent doc3 = new DocContent();
		doc3.setContent(
			"<p><b>块级SDT测试内容：</b></p>" +
			"<p>1. 这是第一段内容，包含<u>下划线</u>文本</p>" +
			"<p>2. 这是第二段内容，包含<i>斜体</i>文本</p>" +
			"<p>3. 这是第三段内容，包含<b>粗体</b>文本</p>"
		);
		doc3.setKey("templateElement659406838063174");
		docContents.add(doc3);
		
		// 如果存在块级SDT，添加测试数据（这些tag名称可能需要根据实际文档调整）
		DocContent blockDoc1 = new DocContent();
		blockDoc1.setContent(
			"<p><b>块级内容控件测试</b></p>" +
			"<p>这是一个多段落的块级内容：</p>" +
			"<p>• 第一项：<i>重要信息</i></p>" +
			"<p>• 第二项：<u>关键数据</u></p>" +
			"<p>• 第三项：<b>核心内容</b></p>"
		);
		blockDoc1.setKey("blockElement1"); // 假设的块级SDT tag
		docContents.add(blockDoc1);
		
		DocContent blockDoc2 = new DocContent();
		blockDoc2.setContent(
			"多行纯文本块级内容测试\n" +
			"第一行：基本信息\n" +
			"第二行：详细描述\n" +
			"第三行：补充说明"
		);
		blockDoc2.setKey("blockElement2"); // 假设的块级SDT tag
		docContents.add(blockDoc2);
		
		try {
			// 执行合并，这将自动输出所有找到的SDT tags
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("块级SDT测试完成！输出文件: " + basePath + File.separator + outputFileName);
			
			System.out.println("\n=== 测试数据说明 ===");
			System.out.println("已为以下tag准备了测试数据：");
			for (DocContent content : docContents) {
				System.out.println("Tag: " + content.getKey());
				System.out.println("内容预览: " + 
					(content.getContent().length() > 50 ? 
						content.getContent().substring(0, 50) + "..." : 
						content.getContent()));
				System.out.println("---");
			}
			
		} catch (Exception e) {
			System.err.println("块级SDT测试失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试块级SDT中的HTML表格功能
	 */
	public static void testHtmlTableInBlockSdt() {
		System.out.println("\n=== 测试块级SDT中的HTML表格功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_html_table_test.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		List<DocContent> docContents = new ArrayList<>();
		
		// 测试1：简单的HTML表格
		DocContent simpleTable = new DocContent();
		simpleTable.setContent(
			"<p><b>员工信息表：</b></p>" +
			"<table>" +
			"<tr><th>姓名</th><th>职位</th><th>部门</th></tr>" +
			"<tr><td>张三</td><td>软件工程师</td><td>技术部</td></tr>" +
			"<tr><td>李四</td><td>产品经理</td><td>产品部</td></tr>" +
			"<tr><td>王五</td><td>UI设计师</td><td>设计部</td></tr>" +
			"</table>" +
			"<p>以上为公司员工基本信息</p>"
		);
		simpleTable.setKey("templateElement659406838063174"); // 使用已知的块级SDT tag
		docContents.add(simpleTable);
		
		// 测试2：包含HTML格式的表格
		DocContent formattedTable = new DocContent();
		formattedTable.setContent(
			"<p><b>项目进度表：</b></p>" +
			"<table>" +
			"<tr><th>项目名称</th><th>负责人</th><th>状态</th><th>进度</th></tr>" +
			"<tr><td><b>系统升级</b></td><td><i>张三</i></td><td><u>进行中</u></td><td>75%</td></tr>" +
			"<tr><td><b>新功能开发</b></td><td><i>李四</i></td><td><u>已完成</u></td><td>100%</td></tr>" +
			"<tr><td><b>Bug修复</b></td><td><i>王五</i></td><td><u>待开始</u></td><td>0%</td></tr>" +
			"</table>" +
			"<p><i>注：进度每周更新一次</i></p>"
		);
		formattedTable.setKey("blockElement1"); // 假设的块级SDT tag
		docContents.add(formattedTable);
		
		// 测试3：包含换行的表格单元格
		DocContent complexTable = new DocContent();
		complexTable.setContent(
			"<p><b>合同条款摘要：</b></p>" +
			"<table>" +
			"<tr><th>条款编号</th><th>条款内容</th><th>备注</th></tr>" +
			"<tr><td>第一条</td><td><b>合同目的</b><br/>规定双方权利义务<br/>确保项目顺利进行</td><td><i>重要条款</i></td></tr>" +
			"<tr><td>第二条</td><td><b>履行期限</b><br/>项目周期：6个月<br/>里程碑：3个</td><td><u>关键时间节点</u></td></tr>" +
			"<tr><td>第三条</td><td><b>付款方式</b><br/>首付：30%<br/>中期：40%<br/>尾款：30%</td><td>分期付款</td></tr>" +
			"</table>" +
			"<p>详细条款请参考完整合同文档</p>"
		);
		complexTable.setKey("blockElement2"); // 假设的块级SDT tag
		docContents.add(complexTable);
		
		// 测试4：混合内容（表格前后有其他内容）
		DocContent mixedContent = new DocContent();
		mixedContent.setContent(
			"<p><b>财务报表</b></p>" +
			"<p>以下是本季度的财务数据：</p>" +
			"<table>" +
			"<tr><th>科目</th><th>本期金额</th><th>上期金额</th></tr>" +
			"<tr><td>营业收入</td><td><b>1,000,000</b></td><td>800,000</td></tr>" +
			"<tr><td>营业成本</td><td>600,000</td><td>500,000</td></tr>" +
			"<tr><td>净利润</td><td><b><u>400,000</u></b></td><td>300,000</td></tr>" +
			"</table>" +
			"<p><i>注：金额单位为人民币元</i></p>" +
			"<p>本期业绩相比上期有显著提升。</p>"
		);
		mixedContent.setKey("templateElement659406749519941"); // 使用已知的tag测试
		docContents.add(mixedContent);
		
		try {
			// 执行合并，这将自动输出所有找到的SDT tags并处理HTML表格
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("HTML表格测试完成！输出文件: " + basePath + File.separator + outputFileName);
			
			System.out.println("\n=== HTML表格测试数据说明 ===");
			System.out.println("测试了以下HTML表格功能：");
			System.out.println("1. 简单表格（th/td标签）");
			System.out.println("2. 带格式的表格单元格（b/i/u标签）");
			System.out.println("3. 单元格内换行（br标签）");
			System.out.println("4. 表格前后的混合内容");
			System.out.println("支持的HTML表格标签：");
			System.out.println("  - <table>：表格容器");
			System.out.println("  - <tr>：表格行");
			System.out.println("  - <th>：表头单元格（自动加粗居中）");
			System.out.println("  - <td>：普通单元格");
			System.out.println("  - 单元格内支持：<b>、<i>、<u>、<br>等格式标签");
			
		} catch (Exception e) {
			System.err.println("HTML表格测试失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试多次调用时表格内容清空功能
	 */
	public static void testMultipleTableCalls() {
		System.out.println("\n=== 测试多次调用时表格内容清空功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName1 = "output_table_test1.docx";
		String outputFileName2 = "output_table_test2.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                // 将URL转换为URI，再转换为File对象
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		
		// 第一次调用 - 创建第一个表格
		List<DocContent> docContents1 = new ArrayList<>();
		DocContent tableDoc1 = new DocContent();
		tableDoc1.setContent(
			"<p><b>第一次调用 - 员工信息表：</b></p>" +
			"<table>" +
			"<tr><th>姓名</th><th>职位</th></tr>" +
			"<tr><td>张三</td><td>软件工程师</td></tr>" +
			"<tr><td>李四</td><td>产品经理</td></tr>" +
			"</table>" +
			"<p>这是第一次调用的表格</p>"
		);
		tableDoc1.setKey("templateElement659406749519941");
		docContents1.add(tableDoc1);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName1, docContents1);
			System.out.println("第一次调用完成！输出文件: " + basePath + File.separator + outputFileName1);
		} catch (Exception e) {
			System.err.println("第一次调用失败: " + e.getMessage());
			e.printStackTrace();
		}
		
		// 第二次调用 - 使用同一个模板和相同的tag，但是内容不同
		List<DocContent> docContents2 = new ArrayList<>();
		DocContent tableDoc2 = new DocContent();
		tableDoc2.setContent(
			"<p><b>第二次调用 - 项目信息表：</b></p>" +
			"<table>" +
			"<tr><th>项目名称</th><th>负责人</th><th>状态</th></tr>" +
			"<tr><td>系统升级</td><td>王五</td><td>进行中</td></tr>" +
			"<tr><td>新功能开发</td><td>赵六</td><td>完成</td></tr>" +
			"<tr><td>Bug修复</td><td>钱七</td><td>待开始</td></tr>" +
			"</table>" +
			"<p>这是第二次调用的表格，内容完全不同</p>"
		);
		tableDoc2.setKey("templateElement659406749519941"); // 使用相同的tag
		docContents2.add(tableDoc2);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName2, docContents2);
			System.out.println("第二次调用完成！输出文件: " + basePath + File.separator + outputFileName2);
			
			System.out.println("\n=== 测试说明 ===");
			System.out.println("请检查两个输出文件：");
			System.out.println("1. " + outputFileName1 + " - 应该包含员工信息表（2行数据）");
			System.out.println("2. " + outputFileName2 + " - 应该包含项目信息表（3行数据）");
			System.out.println("如果第二个文件包含了第一个文件的表格内容，说明清空功能有问题");
			System.out.println("如果第二个文件只包含项目信息表，说明清空功能正常");
			
		} catch (Exception e) {
			System.err.println("第二次调用失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试表格边框和宽度设置功能
	 */
	public static void testTableBorderAndWidth() {
		System.out.println("\n=== 测试表格边框和宽度设置功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_table_style_test.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		List<DocContent> docContents = new ArrayList<>();
		
		// 测试1：带边框和宽度的表格
		DocContent tableDoc1 = new DocContent();
		tableDoc1.setContent(
			"<p><b>带边框和宽度的表格示例：</b></p>" +
			"<table style=\"border: 1px solid black; width: 80%\">" +
			"<tr><th style=\"width: 30%\">项目</th><th style=\"width: 40%\">描述</th><th style=\"width: 30%\">状态</th></tr>" +
			"<tr><td>系统升级</td><td>升级核心组件版本</td><td>进行中</td></tr>" +
			"<tr><td>功能开发</td><td>实现新的业务需求</td><td>已完成</td></tr>" +
			"</table>" +
			"<p>这个表格设置了80%的宽度和边框</p>"
		);
		tableDoc1.setKey("templateElement659406838063174");
		docContents.add(tableDoc1);
		
//		// 测试2：无边框但有列宽的表格
//		DocContent tableDoc2 = new DocContent();
//		tableDoc2.setContent(
//			"<p><b>无边框但有列宽的表格示例：</b></p>" +
//			"<table style=\"width: 100%\">" +
//			"<tr>" +
//			"<th style=\"width: 20%\">姓名</th>" +
//			"<th style=\"width: 15%\">职位</th>" +
//			"<th style=\"width: 45%\">工作内容</th>" +
//			"<th style=\"width: 20%\">部门</th>" +
//			"</tr>" +
//			"<tr><td>张三</td><td>工程师</td><td>负责系统架构设计和核心功能开发</td><td>技术部</td></tr>" +
//			"<tr><td>李四</td><td>经理</td><td>负责项目整体规划和团队管理</td><td>项目部</td></tr>" +
//			"</table>" +
//			"<p>这个表格没有边框，但设置了不同的列宽</p>"
//		);
//		tableDoc2.setKey("templateElement659406838063174");
//		docContents.add(tableDoc2);
		
//		// 测试3：默认样式的表格（作为对比）
//		DocContent tableDoc3 = new DocContent();
//		tableDoc3.setContent(
//			"<p><b>默认样式的表格示例：</b></p>" +
//			"<table>" +
//			"<tr><th>产品</th><th>价格</th><th>库存</th></tr>" +
//			"<tr><td>产品A</td><td>￥100</td><td>50</td></tr>" +
//			"<tr><td>产品B</td><td>￥200</td><td>30</td></tr>" +
//			"</table>" +
//			"<p>这个表格使用默认样式</p>"
//		);
//		tableDoc3.setKey("templateElement659406838063174");
//		docContents.add(tableDoc3);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("表格样式测试完成！输出文件: " + basePath + File.separator + outputFileName);
			
			System.out.println("\n=== 表格样式测试说明 ===");
			System.out.println("测试了以下表格样式功能：");
			System.out.println("1. 带边框和宽度的表格（80%宽度，黑色边框）");
			System.out.println("2. 无边框但有列宽的表格（100%宽度，列宽分别为20%、15%、45%、20%）");
			System.out.println("3. 默认样式的表格（作为对比）");
			System.out.println("\n支持的样式属性：");
			System.out.println("- table的style属性：");
			System.out.println("  * width: 设置表格整体宽度（支持百分比）");
			System.out.println("  * border: 设置表格边框");
			System.out.println("- th/td的style属性：");
			System.out.println("  * width: 设置列宽（支持百分比）");
			
		} catch (Exception e) {
			System.err.println("表格样式测试失败: " + e.getMessage());
			e.printStackTrace();
		}
	}

	/**
	 * 测试表格边框和对齐功能（专门用于调试）
	 */
	public static void testTableBorderAndAlignment() {
		System.out.println("\n=== 测试表格边框和对齐功能（调试版本） ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "output_border_align_test.docx";
        
        URL resourceRootUrl = Test.class.getClassLoader().getResource("");
        String basePath = "";
        if (resourceRootUrl != null) {
            try {
                File resourceRootFile = new File(resourceRootUrl.toURI());
                basePath = resourceRootFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println("Error converting URL to file path: " + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource root not found!");
        }
        
		ContentControlMerge merge = new ContentControlMerge();
		List<DocContent> docContents = new ArrayList<>();
		
		// 测试边框和对齐功能
		DocContent tableDoc = new DocContent();
		tableDoc.setContent(
			"<table style=\"width: 100%; border-collapse: collapse;\">" +
			"<tr>" +
			"<th style=\"text-align: center; color: red; width: 30%; border: 1px solid black; padding: 8px;\">品牌</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">产品名称</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">规格</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">类型</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">氯离子含量</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">工艺</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">功效</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">添加剂名称</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">添加剂含量</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">添加剂执行标准</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">暂定采购量/吨</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">供货区域</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">执行标准</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">含税结算价</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">含税结算价是否含包装</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">其他费用</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">金额/元</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">税率</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">生产工厂</th>" +
			"<th style=\"text-align: center; color: red; border: 1px solid black; padding: 8px;\">其他</th>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px; width: 30%;\">113</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">12</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">2343</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">测试中</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">3124</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">生存之道</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">是的CV发展</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">的思想AC</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">显示的ZC</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">小城市</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">成都市v分</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">出发v东西</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">程序</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">出发c</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">v兄弟</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">测试中v</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">测试数据</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">测试数据</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">测试数据</td>" +
			"<td style=\"text-align: center; border: 1px solid black; padding: 8px;\">测试数据</td>" +
			"</tr>" +
			"</table>"
		);
		tableDoc.setKey("templateElement659406838063174");
		docContents.add(tableDoc);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("边框和对齐测试完成！输出文件: " + basePath + File.separator + outputFileName);
			
			System.out.println("\n=== 表格样式功能说明 ===");
			System.out.println("测试内容：");
			System.out.println("1. 表格样式：width: 100%, border-collapse: collapse");
			System.out.println("2. 表头样式：color: red（红色文字）");
			System.out.println("3. 第一列宽度：width: 30%（30%宽度）");
			System.out.println("4. 单元格样式：");
			System.out.println("   - border: 1px solid black（黑色边框）");
			System.out.println("   - padding: 8px（内边距）");
			System.out.println("   - text-align: center（居中对齐）");
			
			System.out.println("\n请检查生成的Word文档是否显示了：");
			System.out.println("✓ 红色表头文字");
			System.out.println("✓ 第一列30%宽度");
			System.out.println("✓ 黑色边框和内边距");
			System.out.println("✓ 居中对齐的单元格内容");
			
		} catch (Exception e) {
			System.err.println("边框和对齐测试失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试表格颜色功能
	 */
	public static void testTableColorSupport() {
		String inputFileName = "file4.docx";
		String outputFileName = "file4-color-test.docx";
		
		URL resourceRootUrl = Test.class.getClassLoader().getResource("");
		String basePath = "";
		if (resourceRootUrl != null) {
			try {
				File resourceRootFile = new File(resourceRootUrl.toURI());
				basePath = resourceRootFile.getAbsolutePath();
			} catch (Exception e) {
				System.out.println("Error converting URL to file path: " + e.getMessage());
				e.printStackTrace();
				return;
			}
		} else {
			System.out.println("Resource root not found!");
			return;
		}
		
		List<DocContent> docContents = new ArrayList<DocContent>();
		ContentControlMerge merge = new ContentControlMerge();
		
		// 测试各种颜色格式 - 包含表格前后的内容
		DocContent colorTableDoc = new DocContent();
		colorTableDoc.setContent(
			"<p><b>颜色支持功能测试表格：</b></p>" +
			"<table style=\"border: 1px solid black; width: 80%\">" +
			"<tr>" +
			"<th style=\"color: red\">红色表头</th>" +
			"<th style=\"color: #0000FF\">蓝色表头</th>" +
			"<th style=\"color: rgb(0, 128, 0)\">绿色表头</th>" +
			"<th style=\"color: orange\">橙色表头</th>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: red\">红色文字</td>" +
			"<td style=\"color: blue\">蓝色文字</td>" +
			"<td style=\"color: green\">绿色文字</td>" +
			"<td style=\"color: purple\">紫色文字</td>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: #FF0000\">十六进制红色</td>" +
			"<td style=\"color: rgb(0, 0, 255)\">RGB蓝色</td>" +
			"<td style=\"color: rgba(0, 255, 0, 0.8)\">RGBA绿色</td>" +
			"<td style=\"color: navy\">深蓝色</td>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: yellow\">黄色文字</td>" +
			"<td style=\"color: cyan\">青色文字</td>" +
			"<td style=\"color: magenta\">洋红色文字</td>" +
			"<td style=\"color: gray\">灰色文字</td>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: brown\">棕色文字</td>" +
			"<td style=\"color: pink\">粉色文字</td>" +
			"<td style=\"color: lime\">青柠色文字</td>" +
			"<td style=\"color: teal\">蓝绿色文字</td>" +
			"</tr>" +
			"</table>" +
			"<p><b>支持的颜色格式说明：</b></p>" +
			"<p>1. 颜色名称：red, blue, green, black, white, yellow, cyan, magenta, gray, orange, purple, brown, pink, lime, navy, teal, silver, gold, maroon, olive, aqua, fuchsia</p>" +
			"<p>2. 十六进制：#FF0000 或 FF0000</p>" +
			"<p>3. RGB格式：rgb(255, 0, 0)</p>" +
			"<p>4. RGBA格式：rgba(255, 0, 0, 1) - 忽略透明度</p>"
		);
		colorTableDoc.setKey("templateElement659406838063174");
		docContents.add(colorTableDoc);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("颜色功能测试完成！输出文件: " + basePath + File.separator + outputFileName);
			
			System.out.println("\n=== 颜色功能测试说明 ===");
			System.out.println("测试内容：");
			System.out.println("1. 颜色名称：red, blue, green, orange, purple, yellow, cyan, magenta, gray, brown, pink, lime, teal");
			System.out.println("2. 十六进制：#0000FF, #FF0000");
			System.out.println("3. RGB格式：rgb(0, 128, 0), rgb(0, 0, 255)");
			System.out.println("4. RGBA格式：rgba(0, 255, 0, 0.8)");
			
			System.out.println("\n请检查生成的Word文档是否显示了：");
			System.out.println("✓ 各种颜色的表头文字");
			System.out.println("✓ 各种颜色的单元格文字");
			System.out.println("✓ 不同颜色格式的正确显示");
			
		} catch (Exception e) {
			System.err.println("颜色功能测试失败: " + e.getMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试表格前后内容混合功能
	 */
	public static void testMixedContentWithTable() {
		System.out.println("\n=== 测试表格前后内容混合功能 ===");
		
		String inputFileName = "file4.docx";
		String outputFileName = "file4-mixed-content-test.docx";
		
		URL resourceRootUrl = Test.class.getClassLoader().getResource("");
		String basePath = "";
		if (resourceRootUrl != null) {
			try {
				File resourceRootFile = new File(resourceRootUrl.toURI());
				basePath = resourceRootFile.getAbsolutePath();
			} catch (Exception e) {
				System.out.println("Error converting URL to file path: " + e.getMessage());
				e.printStackTrace();
				return;
			}
		} else {
			System.out.println("Resource root not found!");
			return;
		}
		
		List<DocContent> docContents = new ArrayList<DocContent>();
		ContentControlMerge merge = new ContentControlMerge();
		
		// 测试表格前后都有内容的复杂场景
		DocContent mixedContentDoc = new DocContent();
		mixedContentDoc.setContent(
			"<p><b>项目进度报告</b></p>" +
			"<p>以下是本月项目进度统计表：</p>" +
			"<table style=\"border: 1px solid black; width: 90%; text-align: center\">" +
			"<tr>" +
			"<th style=\"width: 25%; color: blue\">项目名称</th>" +
			"<th style=\"width: 20%; color: blue\">负责人</th>" +
			"<th style=\"width: 15%; color: blue\">状态</th>" +
			"<th style=\"width: 15%; color: blue\">进度</th>" +
			"<th style=\"width: 25%; color: blue\">备注</th>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: green\">系统升级项目</td>" +
			"<td>张三</td>" +
			"<td style=\"color: orange\">进行中</td>" +
			"<td>75%</td>" +
			"<td>预计下周完成</td>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: green\">新功能开发</td>" +
			"<td>李四</td>" +
			"<td style=\"color: green\">已完成</td>" +
			"<td>100%</td>" +
			"<td>已上线运行</td>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: green\">Bug修复</td>" +
			"<td>王五</td>" +
			"<td style=\"color: red\">待开始</td>" +
			"<td>0%</td>" +
			"<td>等待需求确认</td>" +
			"</tr>" +
			"<tr>" +
			"<td style=\"color: green\">性能优化</td>" +
			"<td>赵六</td>" +
			"<td style=\"color: orange\">进行中</td>" +
			"<td>40%</td>" +
			"<td>正在分析瓶颈</td>" +
			"</tr>" +
			"</table>" +
			"<p><b>总结说明：</b></p>" +
			"<p>1. 本月共启动4个项目，其中1个已完成，2个进行中，1个待开始。</p>" +
			"<p>2. 整体进度符合预期，<u>系统升级项目</u>需要重点关注。</p>" +
			"<p>3. <i>下月计划</i>：完成所有进行中项目，启动新的功能模块开发。</p>" +
			"<p>报告日期：2024年12月28日</p>"
		);
		mixedContentDoc.setKey("templateElement659406838063174");
		docContents.add(mixedContentDoc);
		
		try {
			merge.doMerge(basePath + File.separator + inputFileName, basePath + File.separator + outputFileName, docContents);
			System.out.println("表格前后内容混合测试完成！输出文件: " + basePath + File.separator + outputFileName);
			
			System.out.println("\n=== 混合内容功能说明 ===");
			System.out.println("测试内容包括：");
			System.out.println("✓ 表格前的标题段落");
			System.out.println("✓ 表格前的说明段落");
			System.out.println("✓ 带边框、宽度、对齐的表格");
			System.out.println("✓ 表格中的颜色设置");
			System.out.println("✓ 表格后的总结段落");
			System.out.println("✓ 表格后的格式化文本（粗体、下划线、斜体）");
			System.out.println("✓ 表格后的日期信息");
			
			System.out.println("\n请检查生成的Word文档是否显示了：");
			System.out.println("1. 表格前的标题和说明文字");
			System.out.println("2. 正确的表格结构和样式");
			System.out.println("3. 表格后的总结和格式化文字");
			
		} catch (Exception e) {
			System.err.println("表格前后内容混合测试失败: " + e.getMessage());
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
//		Test test = new Test();
//		test.TestUsePlaceholderMerge();
//		test.TestBookmarkMerge();
//		test.TestContentControlMerge();
//		
		// 测试ContentControl合并功能
//		testContentControlMerge();
//		
//		// 测试HTML格式功能
//		testHtmlFormatMerge();
//		
//		// 使用实际模板标识符测试
//		testRealTemplateWithHtmlFormat();
//		
//		// 对比测试
//		testPlainTextVsHtmlFormat();
//		
//		// 测试块级SDT和显示所有tags
//		testBlockSdtAndShowAllTags();
//		
//		// 测试HTML表格功能
//		testHtmlTableInBlockSdt();
//		
//		// 测试多次调用时表格内容清空功能
//		testMultipleTableCalls();
//		
//		// 测试表格边框和宽度设置功能
//		testTableBorderAndWidth();
		
		// 测试表格边框和对齐功能（调试版本）
		testTableBorderAndAlignment();
		
		// 测试表格颜色功能
		testTableColorSupport();
		
		// 测试表格前后内容混合功能
		testMixedContentWithTable();
	}
}
